package org.xbs.demo1.tools;

import lombok.Data;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.xbs.demo1.pojo.User;
import org.xbs.demo1.pojo.Video;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
import java.util.UUID;

//这是一个工具类用于操作文件
@Data
public class FileTools {
    //设定一个文件保存的根目录
    private static final String ROOT_PATH = "D://competiton_image//";
    //创建一个视频文件存储的目录
    private static final String VIDEO_PATH = "D://video";

    //这是一个保存文件的方法
    public static void saveFile(User user) throws IOException {
        if (user.getImageFile() != null) {
            //创建uuid作为唯一标识
            String uuid = UUID.randomUUID().toString();
            //获得传入文件的文件名
            String originalFileName = user.getImageFile().getOriginalFilename();
            //拼接文件名组成新的存储文件名
            String newFileName = ROOT_PATH + uuid + "_" + originalFileName;
            //将存储文件名保存在user的image字段中
            user.setImage(newFileName);
            //创建对应文件对象
            File file = new File(newFileName);
            //将传入的文件保存在这个对象中
            user.getImageFile().transferTo(file);
        }
    }

    //这是一个删除文件的方法，为了解决根据id删除时候没有文件路径的问题，我们在service层中要先根据id查询对应文件路径
    public static void deleteFile(User user) {
        if (user.getImage() != null) {
            File file = new File(user.getImage());
            file.delete();
        }
    }

    //这是一个上传后端文件到前端的办法
    public static void uploadFile(User user) throws IOException {
        // 1.判断image字段是否为空
        if (user.getImage() != null) {
            // 2.创建File对象
            File file = new File(user.getImage());
            // 3.创建resource对象并用filesystemresource实现
            Resource resource = new FileSystemResource(file);
            try (InputStream inputStream = resource.getInputStream();
                 ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
                // 4. 读取文件内容到字节数组输出流
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
                // 5. 将字节数组输出流中的内容转换为字节数组
                byte[] fileBytes = outputStream.toByteArray();
                // 6. 进行 Base64 编码
                String base64Encoded = Base64.getEncoder().encodeToString(fileBytes);
                // 7. 将 Base64 编码后的字符串存入 User 对象的 image 字段
                user.setImageBase64Code(base64Encoded);

            }
        }


    }

    //这是一个修改文件的办法，传入新文件和原文件路径
    public static void updateFile(User user) throws IOException {
        //首先判断是否传入文件
        if (user.getImageFile() != null) {
            //之后判断是否传入原文件的路径
            if (user.getImage() != null) {
                //如果传入了文件，并且传入了原文件的路径，那么就先删除原文件
                FileTools.deleteFile(user);
                //删除后再保存新文件
                FileTools.saveFile(user);
            }
        }
    }

    public static void saveVideo(Video video) throws IOException {
        if (video.getVideo() != null) {
            //创建uuid作为唯一标识
            String uuid = UUID.randomUUID().toString();
            //获得传入文件的文件名
            String originalFileName = video.getVideo().getOriginalFilename();
            //拼接文件名组成新的存储文件名
            String newFileName = VIDEO_PATH  + uuid + "_" + originalFileName;
            //将存储文件名保存在user的image字段中
            video.setStorePath(newFileName);
            //创建对应文件对象
            File file = new File(newFileName);
            //将传入的文件保存在这个对象中
            video.getVideo().transferTo(file);
        }
    }
}
//最新问题是看一下删除文件的方法想一想这个方法合不合理，再思考一下删除文件的时候要不要涉及到对数据库的操作
